﻿Imports System.Data

Class CUsuarios
    Private lstUsuarios As New List(Of CUsuario)
    Private lstAreas As New List(Of CArea)
    Private dtfunciones As New DataTable()
    Private dtFuncionesActuales As New DataTable()
    Dim SerGrales As New CServiciosGenerales()
    Dim UsuarioElegido As New CUsuario()
    Dim blnBanderaBorrado As Boolean = False

#Region "Carga Página"
    Private Sub CUsuarios_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
        Try
            CargaUsuarios()
            CargaAreas()
            CargaFunciones()

            dtFuncionesActuales.Columns.Add("ID_FUNCION")

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Carga página usuarios", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

#End Region

#Region "Cargas iniciales"
    Private Sub CargaUsuarios()
        Try
            Dim intBitacora As Integer = CUtileria.GrabarBitacora("Usuarios", "Carga usuarios", "Carga los usuarios existentes en el sistema")

            lstUsuarios = SerGrales.ObtieneUsuarios(CServiciosMacrosSyBaseDB.IDUSUARIO)

            grdUsuarios.ItemsSource = lstUsuarios
            grdUsuarios.UpdateLayout()

            CUtileria.CompletarRegBitacora(intBitacora)

        Catch ex As Exception
            Dim intBitacoraError As Integer = CUtileria.GrabarBitacora("Usuarios", "Carga usuarios", ex.Message)
            CUtileria.CompletarRegBitacora(intBitacoraError)
        End Try
    End Sub

    Private Sub CargaAreas()
        Try
            Dim intBitacora As Integer = CUtileria.GrabarBitacora("Usuarios", "Carga áreas", "Carga las áreas de las cuales se pueden elegir funciones para el usuario")

            lstAreas = SerGrales.ObtieneAreas()

            lsvAreas.ItemsSource = lstAreas
            lsvAreas.Items.Refresh()

            CUtileria.CompletarRegBitacora(intBitacora)

        Catch ex As Exception
            Dim intBitacoraError As Integer = CUtileria.GrabarBitacora("Usuarios", "Carga áreas", ex.Message)
            CUtileria.CompletarRegBitacora(intBitacoraError)
        End Try
    End Sub

    Private Sub CargaFunciones()
        Try
            Dim intBitacora As Integer = CUtileria.GrabarBitacora("Usuarios", "Carga funciones", "Carga todas las funciones que se pueden elegir para el usuario")

            dtfunciones = SerGrales.ObtieneFunciones()

            CUtileria.CompletarRegBitacora(intBitacora)

        Catch ex As Exception
            Dim intBitacoraError As Integer = CUtileria.GrabarBitacora("Usuarios", "Carga funciones", ex.Message)
            CUtileria.CompletarRegBitacora(intBitacoraError)
        End Try
    End Sub
#End Region

#Region "Busca usuario DECALOG"
    Private Sub btnConsultar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnConsultar.Click
        BuscarUsuario()
    End Sub

    Private Sub BuscarUsuario()
        If txtClave.Text.Length > 0 Then
            If txtClave.Text.Equals(CServiciosMacrosSyBaseDB.USUARIO) Then                

                MessageBox.Show("Ya está registrado el usuario dentro del sistema.", "Búsqueda usuario", MessageBoxButton.OK, MessageBoxImage.Warning)
            Else
                Mouse.OverrideCursor = Cursors.Wait

                Try
                    Dim intBit As Integer = CUtileria.GrabarBitacora("Usuarios", "Búsqueda usuario", "Se busca en DECALOG al usuario con clave " & txtClave.Text)

                    UsuarioElegido = SerGrales.ValidarExistenciaUsuarioDECALOG(txtClave.Text)

                    CUtileria.CompletarRegBitacora(intBit)

                    If Not UsuarioElegido Is Nothing Then
                        Dim lstAux = From r In lstUsuarios Where r.Clave = txtClave.Text
                                                          Select r

                        Mouse.OverrideCursor = Cursors.Arrow

                        If lstAux.Count > 0 Then
                            btnRegistrar.IsEnabled = False

                            MessageBox.Show("Ya está registrado el usuario dentro del sistema.", "Búsqueda usuario", MessageBoxButton.OK, MessageBoxImage.Warning)
                        Else
                            txtNombre.Text = UsuarioElegido.Nombre
                            chkActivo.IsChecked = True

                            btnRegistrar.IsEnabled = True
                        End If
                    Else
                        btnRegistrar.IsEnabled = False

                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("No existe un usuario en DECALOG con la clave ingresada", "Búsqueda usuario", MessageBoxButton.OK, MessageBoxImage.Warning)
                    End If
                Catch ex As Exception
                    Dim intBitError As Integer = CUtileria.GrabarBitacora("Usuarios", "Búsqueda usuario", ex.Message)

                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("Error TI500. " & ex.Message, "Búsqueda usuario", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        Else
            MessageBox.Show("Favor de ingresar la clave del usuario a buscar", "Búsqueda usuario", MessageBoxButton.OK, MessageBoxImage.Error)
        End If
    End Sub
#End Region

#Region "Limpiar"
    Private Sub btnLimpiar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnLimpiar.Click
        LimpiaDatos(0)
    End Sub

    Private Sub LimpiaDatos(ByVal Opcion As Integer)
        txtNombre.Text = String.Empty
        txtClave.IsEnabled = True
        btnRegistrar.IsEnabled = False
        btnEliminar.IsEnabled = False
        lsvFunciones.ItemsSource = Nothing
        lsvFunciones.Items.Refresh()
        lsvAreas.SelectedItem = Nothing
        lsvAreas.UpdateLayout()
        dtFuncionesActuales = New DataTable()
        dtFuncionesActuales.Columns.Add("ID_FUNCION")
        chkActivo.IsChecked = False        

        If Opcion = 0 Or Opcion = 1 Then
            txtClave.Text = String.Empty
            blnBanderaBorrado = False
        End If

        If Opcion = 0 Or Opcion = 2 Then
            UsuarioElegido = New CUsuario()
            blnBanderaBorrado = True
        End If

        If Opcion = 0 Then
            grdUsuarios.SelectedItem = Nothing
            grdUsuarios.UpdateLayout()
        End If
    End Sub

    Private Sub txtClave_PreviewKeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs) Handles txtClave.PreviewKeyDown
        If e.Key = Key.Enter Then
            BuscarUsuario()
            e.Handled = True
        ElseIf e.Key = Key.Delete Or e.Key = Key.Return Or e.Key = Key.Space Or e.Key = Key.Back Then
            LimpiaDatos(2)            
        End If
    End Sub

    Private Sub txtClave_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtClave.TextChanged
        If blnBanderaBorrado Then
            LimpiaDatos(2)
        End If
    End Sub
#End Region

#Region "Selección usuario"
    Private Sub grdUsuarios_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles grdUsuarios.SelectionChanged
        Try
            UsuarioElegido = grdUsuarios.SelectedItem
            dtFuncionesActuales = New System.Data.DataTable()

            If Not UsuarioElegido Is Nothing Then
                LimpiaDatos(1)

                dtFuncionesActuales = SerGrales.ObtieneFuncionesUsuario(UsuarioElegido.Id)

                txtClave.IsEnabled = False
                txtClave.Text = UsuarioElegido.Clave
                txtNombre.Text = UsuarioElegido.Nombre
                chkActivo.IsChecked = UsuarioElegido.Activo

                btnRegistrar.IsEnabled = True

                If UsuarioElegido.Activo Then
                    btnEliminar.IsEnabled = True
                Else
                    btnEliminar.IsEnabled = False
                End If
            Else
                btnRegistrar.IsEnabled = False
                btnEliminar.IsEnabled = False
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Selección usuario existente", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Selección área y funciones"
    Private Sub lsvAreas_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles lsvAreas.SelectionChanged
        Try
            Dim areaElegida As CArea = lsvAreas.SelectedItem

            If Not areaElegida Is Nothing Then
                lsvFunciones.ItemsSource = Nothing

                Dim rwFunciones() As DataRow

                rwFunciones = dtfunciones.Select("ID_AREA = " & areaElegida.Id)

                If rwFunciones.Count > 0 Then
                    Dim lstFunciones = New List(Of CFuncion)(From r In rwFunciones.CopyToDataTable().AsEnumerable Select (CreaFuncion(r)))
                    lsvFunciones.ItemsSource = lstFunciones
                End If

                lsvFunciones.Items.Refresh()
            End If

        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Selección área", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Function CreaFuncion(ByVal dr As DataRow) As CFuncion
        Dim g As CFuncion = New CFuncion()
        Dim blnExiste As Boolean = False
        g.Id = dr("ID")
        g.Nombre = dr("FUNCION_DESC")

        If dtFuncionesActuales.Rows.Count > 0 Then

            For Each drTemporal As DataRow In dtFuncionesActuales.Rows
                If drTemporal(0) = dr("ID") Then
                    blnExiste = True
                End If
            Next

            If blnExiste Then
                g.Seleccionado = True
            Else
                g.Seleccionado = False
            End If
        Else
            g.Seleccionado = False
        End If

        Return g
    End Function

    Private Sub CheckBox_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
        Dim chkAux As CheckBox = sender
        Dim funElegida As CFuncion = lsvFunciones.SelectedItem
        Dim drBorrar As DataRow = Nothing

        If Not funElegida Is Nothing Then
            If chkAux.IsChecked Then
                Dim drN As DataRow = dtFuncionesActuales.NewRow()

                drN(0) = funElegida.Id

                dtFuncionesActuales.Rows.Add(drN)
                dtFuncionesActuales.AcceptChanges()
            Else
                For Each dr As DataRow In dtFuncionesActuales.Rows
                    If dr(0) = funElegida.Id Then
                        drBorrar = dr
                    End If
                Next

                If Not drBorrar Is Nothing Then
                    dtFuncionesActuales.Rows.Remove(drBorrar)

                    dtFuncionesActuales.AcceptChanges()
                End If
            End If
        End If
    End Sub
#End Region

#Region "Registra y actualiza usuarios"
    Private Sub btnRegistrar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnRegistrar.Click
        If dtFuncionesActuales.Rows.Count > 0 Then
            Try
                Mouse.OverrideCursor = Cursors.Wait

                If UsuarioElegido.Nuevo Then
                    Dim intBI As Integer = CUtileria.GrabarBitacora("Usuarios", "Inserción usuario", "Se registra el nuevo usuario con clave : " & UsuarioElegido.Clave)

                    Dim intResultado As Integer = SerGrales.InsertaUsuario(UsuarioElegido, dtFuncionesActuales, chkActivo.IsChecked)

                    CUtileria.CompletarRegBitacora(intBI)

                    If intResultado = 0 Then
                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Usuario registrado correctamente", "Alta usuario", MessageBoxButton.OK, MessageBoxImage.Information)

                        LimpiaDatos(0)
                        CargaUsuarios()
                    Else
                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Ocurrió un error al registrar el usuario", "Alta usuario", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Else
                    Dim intBA As Integer = CUtileria.GrabarBitacora("Usuarios", "Actualización usuario", "Se actualiza el usuario con clave : " & UsuarioElegido.Clave)

                    Dim intResultadoA As Integer = SerGrales.ActualizaUsuario(UsuarioElegido, dtFuncionesActuales, chkActivo.IsChecked)

                    CUtileria.CompletarRegBitacora(intBA)

                    If intResultadoA = 0 Then
                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Usuario actualizado correctamente", "Actualización usuario", MessageBoxButton.OK, MessageBoxImage.Information)

                        LimpiaDatos(0)
                        CargaUsuarios()
                    Else
                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Ocurrió un error al actualizar el usuario", "Actualización usuario", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                End If
            Catch ex As Exception
                Dim intBError As Integer = CUtileria.GrabarBitacora("Usuarios", "Registra/Actualiza usuario", ex.Message)
                CUtileria.CompletarRegBitacora(intBError)

                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("Error TI500. " & ex.Message, "Registra/Actualiza usuario", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        Else
            MessageBox.Show("Debe elegir al menos una función para el usuario", "Registra/Actualiza usuario", MessageBoxButton.OK, MessageBoxImage.Error)
        End If
    End Sub
#End Region

#Region "Eliminar usuarios"
    Private Sub btnEliminar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnEliminar.Click
        If Not UsuarioElegido Is Nothing Then
            Dim msgResultado As MessageBoxResult = MessageBox.Show("¿Desea inactivar al usuario seleccionado?", "Inactivación usuario", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgResultado = MessageBoxResult.Yes Then
                Try
                    Mouse.OverrideCursor = Cursors.Wait

                    Dim intBE As Integer = CUtileria.GrabarBitacora("Usuarios", "Inactivación usuario", "Se inactiva el usuario con id = " & UsuarioElegido.Id)

                    Dim ResultadoElim As Boolean = SerGrales.EliminaUsuario(UsuarioElegido)

                    CUtileria.CompletarRegBitacora(intBE)

                    Mouse.OverrideCursor = Cursors.Arrow

                    If ResultadoElim Then
                        MessageBox.Show("El usuario se inactivó correctamente", "Baja usuario", MessageBoxButton.OK, MessageBoxImage.Information)

                        LimpiaDatos(0)
                        CargaUsuarios()
                    Else
                        MessageBox.Show("El usuario no se inactivar correctamente", "Baja usuario", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Catch ex As Exception
                    Dim intBEE As Integer = CUtileria.GrabarBitacora("Usuarios", "Inactivación usuario", ex.Message)
                    CUtileria.CompletarRegBitacora(intBEE)

                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("Error TI500. " & ex.Message, "Inactivación usuario", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        End If
    End Sub
#End Region

End Class
